package com.dorm.cj.创建型.singleton;

/**
 * 静态类只在第一次调用时才加载的特性实现单例模式，具体为外部类在调用getInstance()方法时才加载内部类（延时加载）
 * 且只加载一次，而加载过程是线程安全的，从而保证了创建对象时的线程安全问题
 *
 *
 * JVM 在类的初始化阶段（即在 Class 被加载后，且被线程使用之前），会执行类的初始化。在执行类的初始化期间，JVM 会去获取一个锁。
 * 这个锁可以同步多个线程对同一个类的初始化。
 *
 * 基于这个特性，可以实现另一种线程安全的延迟初始化方案（这个方案被称之为 Initialization On Demand Holder idiom）
 *
 * https://www.infoq.cn/article/double-checked-locking-with-delay-initialization/#anch102163
 *
 *  延迟初始化降低了初始化类或创建实例的开销，但增加了访问被延迟初始化的字段的开销。在大多数时候，正常的初始化要优于延迟初始化。
 * 如果确实需要对实例字段使用线程安全的延迟初始化，请使用上面介绍的基于 volatile 的延迟初始化的方案；如果确实需要对静态字段使用
 * 线程安全的延迟初始化，请使用上面介绍的基于类初始化的方案
 */
public class LazyCat {

    private LazyCat() {
    }

    private static class InnerClass {
        private static LazyCat instance = new LazyCat();
    }

    public static LazyCat getInstance() {
        return InnerClass.instance;
    }


}
